#!/bin/bash

# 服务数据清理脚本
# 用于清理特定服务的数据目录，实现服务初始化效果

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 服务与数据目录及容器名称映射
# 格式: 服务名="目录1 目录2|容器名|依赖服务"
declare -A SERVICE_DIRS=(
    ["mongo"]="mongodb7/data mongodb7/logs|mongodb7|"
    ["redis7"]="redis7/data|redis7|"
    ["rabbitmq"]="rabbitmq/data|rabbitmq3|"
    ["elasticsearch"]="elasticsearch/data elasticsearch/logs|elasticsearch7|"
    ["kibana"]="|kibana7|elasticsearch"
    ["mysql"]="mysql/data mysql/logs|mysql8|"
    ["kafka"]="kafka/data kafka/logs|kafka|"
    ["kafka-ui"]="|kafka-ui|kafka"
    ["nacos"]="nacos/logs|nacos-standalone-mysql|mysql"
)

# 显示帮助信息
show_help() {
    echo "用法: $0 [服务名]"
    echo ""
    echo "服务名可以是以下之一:"
    echo "  all          清理所有服务的数据目录"
    for service in "${!SERVICE_DIRS[@]}"; do
        # 提取目录部分（第一个|之前的内容）
        dirs_part="${SERVICE_DIRS[$service]%%|*}"
        # 提取依赖服务部分（最后一个|之后的内容）
        deps_part="${SERVICE_DIRS[$service]##*|}"
        # 如果目录部分不为空，则显示目录信息
        if [[ -n "$dirs_part" ]]; then
            if [[ -n "$deps_part" && "$deps_part" != "${SERVICE_DIRS[$service]#*|}" ]]; then
                echo "  $service     清理 $dirs_part 目录 (依赖: $deps_part)"
            else
                echo "  $service     清理 $dirs_part 目录"
            fi
        else
            if [[ -n "$deps_part" && "$deps_part" != "${SERVICE_DIRS[$service]#*|}" ]]; then
                echo "  $service     仅停止容器 (依赖: $deps_part)"
            else
                echo "  $service     仅停止容器"
            fi
        fi
    done
    echo ""
    echo "示例:"
    echo "  $0 mysql     清理 MySQL 数据目录"
    echo "  $0 all       清理所有服务的数据目录"
}

# 确认操作
confirm() {
    local msg=$1
    read -p "$msg [y/N]: " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        return 1
    fi
    return 0
}

# 安全删除目录内容的函数
safe_remove_dir_contents() {
    local dir=$1
    
    if [[ -z "$dir" ]]; then
        echo -e "${YELLOW}⚠️  跳过空目录路径${NC}"
        return 0
    fi
    
    if [[ ! -d "$dir" ]]; then
        echo -e "${YELLOW}⚠️  目录不存在: $dir${NC}"
        return 0
    fi
    
    echo -e "${YELLOW}🗑️  删除目录 $dir 的内容...${NC}"
    
    # 删除目录中的所有内容，包括隐藏文件
    rm -rf "$dir"/* "$dir"/.[!.]* "$dir"/..?* 2>/dev/null || true
    
    echo -e "${GREEN}✅ $dir 目录内容已清理${NC}"
}

# 停止并删除容器
stop_container() {
    local container_name=$1
    
    if [[ -z "$container_name" ]]; then
        return 0
    fi
    
    # 检查容器是否存在
    if docker ps -a --format '{{.Names}}' | grep -q "^${container_name}$"; then
        echo -e "${YELLOW}🛑 停止并删除容器 $container_name...${NC}"
        docker stop "$container_name" >/dev/null 2>&1 || true
        docker rm "$container_name" >/dev/null 2>&1 || true
    else
        echo -e "${YELLOW}⚠️  容器 $container_name 未运行${NC}"
    fi
}

# 停止依赖服务容器
stop_dependent_containers() {
    local service=$1
    local stopped_containers=()
    
    # 遍历所有服务，查找依赖当前服务的服务
    for svc in "${!SERVICE_DIRS[@]}"; do
        local service_info=${SERVICE_DIRS[$svc]}
        # 提取依赖服务部分（最后一个|之后的内容）
        local deps_part="${service_info##*|}"
        
        # 检查是否依赖当前服务且不是当前服务本身
        if [[ -n "$deps_part" && "$deps_part" != "${SERVICE_DIRS[$svc]#*|}" && "$deps_part" == "$service" && "$svc" != "$service" ]]; then
            # 提取容器名部分（第二个|之前的内容）
            local container_name=$(echo "${service_info#*|}" | cut -d'|' -f1)
            
            # 停止依赖服务的容器
            if [[ -n "$container_name" ]]; then
                stop_container "$container_name"
                stopped_containers+=("$container_name")
            fi
        fi
    done
    
    # 如果停止了依赖容器，给出提示
    if [[ ${#stopped_containers[@]} -gt 0 ]]; then
        echo -e "${YELLOW}⚠️  已同时停止以下依赖服务容器: ${stopped_containers[*]}${NC}"
    fi
}

# 清理单个服务数据
reset_service() {
    local service=$1
    local service_info=${SERVICE_DIRS[$service]}
    
    if [[ -z "$service_info" ]]; then
        echo -e "${RED}❌ 未知服务: $service${NC}"
        return 1
    fi
    
    # 提取目录部分（第一个|之前的内容）
    local dirs_part="${service_info%%|*}"
    # 提取容器名部分（第一个|之后的内容）
    local container_name="${service_info#*|}"
    # 如果还有|，则需要进一步分割获取容器名
    if [[ "$container_name" == *"|"* ]]; then
        container_name=$(echo "$container_name" | cut -d'|' -f1)
    fi
    # 提取依赖服务部分（最后一个|之后的内容）
    local deps_part="${service_info##*|}"
    # 检查deps_part是否有效（不是整个字符串的一部分）
    if [[ "$deps_part" == "${SERVICE_DIRS[$service]#*|}" ]]; then
        deps_part=""
    fi
    
    echo -e "${YELLOW}🔧 正在清理 $service 服务数据...${NC}"
    
    # 停止依赖此服务的容器
    stop_dependent_containers "$service"
    
    # 停止相关容器
    stop_container "$container_name"
    
    # 清理数据目录
    if [[ -n "$dirs_part" ]]; then
        for dir in $dirs_part; do
            safe_remove_dir_contents "$dir"
        done
    fi
    
    echo -e "${GREEN}✅ $service 服务数据已清理${NC}"
}

# 清理所有服务数据
reset_all() {
    echo -e "${YELLOW}⚠️  注意: 这将删除所有服务的数据目录内容${NC}"
    if ! confirm "确定要继续吗?"; then
        echo -e "${YELLOW}操作已取消${NC}"
        return 0
    fi
    
    # 停止所有相关容器（按照依赖顺序）
    echo -e "${YELLOW}🛑 停止所有相关容器...${NC}"
    # 先停止依赖服务容器
    for service in "${!SERVICE_DIRS[@]}"; do
        # 提取容器名部分（第一个|之后的内容）
        local service_info=${SERVICE_DIRS[$service]}
        local container_name="${service_info#*|}"
        # 如果还有|，则需要进一步分割获取容器名
        if [[ "$container_name" == *"|"* ]]; then
            container_name=$(echo "$container_name" | cut -d'|' -f1)
        fi
        
        stop_container "$container_name"
    done
    
    # 清理所有数据目录
    echo -e "${YELLOW}🗑️  清理所有服务数据目录...${NC}"
    for service in "${!SERVICE_DIRS[@]}"; do
        local service_info=${SERVICE_DIRS[$service]}
        # 提取目录部分（第一个|之前的内容）
        local dirs_part="${service_info%%|*}"
        
        # 清理数据目录
        if [[ -n "$dirs_part" ]]; then
            for dir in $dirs_part; do
                safe_remove_dir_contents "$dir"
            done
        fi
    done
    
    echo -e "${GREEN}🎉 所有服务数据已清理完成${NC}"
}

# 主程序
main() {
    if [[ $# -eq 0 ]]; then
        show_help
        exit 1
    fi
    
    case "$1" in
        -h|--help)
            show_help
            ;;
        all)
            reset_all
            ;;
        *)
            if [[ -n "${SERVICE_DIRS[$1]}" ]]; then
                if confirm "确定要清理 $1 服务的数据吗?"; then
                    reset_service "$1"
                else
                    echo -e "${YELLOW}操作已取消${NC}"
                fi
            else
                echo -e "${RED}❌ 未知服务: $1${NC}"
                show_help
                exit 1
            fi
            ;;
    esac
}

# 执行主程序
main "$@"